#pragma once
#include "headers.h"
#define UP 		D3DXVECTOR3( 0, 1, 0)
#define DOWN 	D3DXVECTOR3( 0,-1, 0)
#define BACK 	D3DXVECTOR3( 0, 0,-1)
#define FRONT 	D3DXVECTOR3( 0, 0, 1)
#define RIGHT 	D3DXVECTOR3( 1, 0, 0)
#define LEFT 	D3DXVECTOR3(-1, 0, 0)
#define SCREEN_HEIGHT 480
#define SCREEN_WIDTH  640
#define KEY_DOWN(key) ((GetAsyncKeyState(key) & 0x8000) ? 1 : 0)
class cCamera///klasa reprezentujaca kamere przez ktora ogldamy uklad
{

private:
///<					   zmienne kamerzaste
  BOOL m_CameraDirty;							 ///< Flaga zmiany parametrow kamery
  D3DXVECTOR3 m_Translation;					 ///< Translacja kamery
  D3DXQUATERNION m_Rotation;					 ///< Rotacja kamery
  D3DXMATRIX m_ViewMatrix;						 ///< Macierz widoku (transformacja kamery)
  D3DXMATRIX m_ProjectionMatrix;				 ///< Macierz projekcji
  FLOAT m_CameraSpeed;							 ///< Szybkosc kamery
  D3DVIEWPORT9 m_Viewport;						 ///< Wziernik kamery

  HRESULT UpdateMatrices();///<					   Aktualizacja macierzy

 
	HRESULT GoDir(FLOAT deltaTime, D3DXVECTOR3 dir);///<					   Funkcje poruszania kamera

	HRESULT Rotate(FLOAT deltaTime, D3DXVECTOR2 dir);///<					   Funkcje poruszania kamera

public:

  cCamera();///<                    konstruktor bezparametryczny - nie wykorzystywany

  virtual ~cCamera();///<                    destruktor

  virtual HRESULT Initialize();///<                    Inicjalizacja kamery

  HRESULT Finalize();///<                      Finalizacja kamery

  HRESULT Update(FLOAT deltaTime);///<                   Aktualizacja logiczna kamery

  HRESULT SetupMatrix(LPDIRECT3DDEVICE9 d3ddev);///<                    ustawienie macierzy

  HRESULT SetViewport(D3DVIEWPORT9 viewport);///<                    Ustawia viewport kamery

  HRESULT GetViewport(D3DVIEWPORT9* viewport);///<                   Zwraca viewport kamery

  D3DXMATRIX GetViewMatrix()///<                    Zwraca macierz widoku
  {
    if(m_CameraDirty) UpdateMatrices();
    return m_ViewMatrix;
  }

  D3DXMATRIX GetProjectionMatrix()///<                    Zwraca macierz projekcji
  {
    if(m_CameraDirty) UpdateMatrices();
    return m_ProjectionMatrix;
  }

  D3DXVECTOR3 GetCameraPosition()///<                    Zwraca pozycje kamery
  {
    return m_Translation;
  }

  D3DXVECTOR3 GetLookAtVector(){///<                   pobieramy punkt na ktory patrzy kamera
	  D3DXVECTOR3 LookAtVector(m_ViewMatrix._13, m_ViewMatrix._23, m_ViewMatrix._33);
	  return LookAtVector;
  }

  D3DXVECTOR3 GetEye(){ ///<                    pobieramy oko
	  D3DXVECTOR3 LookAtVector(m_ViewMatrix._11, m_ViewMatrix._21, m_ViewMatrix._31);
	  return LookAtVector;
  }
};
